home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / comm1 / mmafp187.lha / REXX / MM_AreaFixPlus.rexx
OS/2 REXX Batch file  |  1996-01-16  |  52KB  |  1,477 lines

  1. /*
  2. ** $VER: MM_AreaFixPlus 1.87 (03.01.96)
  3. **
  4. ** Written by Paolo Carotenuto
  5. **
  6. */
  7. DROP MM.
  8. PARSE UPPER ARG MM.Node MM.Mode MM.Command MM.Mail MM.Switch
  9. MM.LogLevel=2
  10. MM.PrgName='MM_AreaFixPlus v1.87'
  11. IF MM.Node='?' THEN CALL Usage();ADDRESS 'MAILMANAGER';CALL ReadCfg();IF MM.Node ~='' THEN CALL MuiCli()
  12. DO y=0 FOR MM.Mails.Count
  13. MM.Mail=MM.Mails.y;MM.Mode='AREAFIX'
  14. DO x=0 FOR MM.AliasAreaFix.Count
  15. DROP Msg.;MM_SearchMsgs MM.Mail Msg '#?' MM.AliasAreaFix.x '#?' IMP !INTR !SENT
  16. IF Rc=0 THEN;DO;DO z=0 FOR Msg.Count;CALL ProcessaMsg(Msg.z);END;END
  17. END
  18. END
  19. DO y=0 FOR MM.Mails.Count
  20. MM.Mail=MM.Mails.y;MM.Mode='RAID'
  21. DO x=0 FOR MM.AliasRaid.Count
  22. DROP Msg.;MM_SearchMsgs MM.Mail Msg '#?' MM.AliasRaid.x '#?' IMP !INTR !SENT
  23. IF Rc=0 THEN;DO;DO z=0 FOR Msg.Count;CALL ProcessaMsg(Msg.z);END;END
  24. END
  25. END
  26. CALL Fine()
  27. ProcessaMsg:PROCEDURE EXPOSE MM.
  28. PARSE ARG MsgNum
  29. MM_ReadMsg MM.Mail MsgNum MM.Msg
  30. IF Rc ~=0 THEN RETURN
  31. PARSE UPPER VAR MM.Msg.Subj MM.Password MM.Switch
  32. MM.FromNode=MM.Msg.FromAddr;MM.FromName=MM.Msg.From
  33. MM.ToNode=MM.Msg.ToAddr;MM.FromFirst=SUBWORD(MM.FromName,1,1)
  34. CALL Init();CALL AddLine(Body,AddReplyKludge(Body))
  35. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  36. MM_GetNodeInfo MM.FromNode MM.Nodo
  37. IF Rc=3 THEN;DO
  38. DO n=0 FOR MM.Unknown.Count
  39. CALL AddLine(Body,Trasforma(MM.Unknown.n))
  40. END
  41. CALL WriteMsg(Body,'Who Are You ?','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  42. RETURN
  43. END
  44. IF STRIP(MM.PassWord) ~=UPPER(MM.Nodo.AreaFixPw) THEN;DO
  45. DO n=0 FOR MM.BadPass.Count
  46. CALL AddLine(Body,Trasforma(MM.BadPass.n))
  47. END
  48. CALL WriteMsg(Body,'Check Your Password Please','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  49. RETURN
  50. END
  51. IF INDEX(MM.Switch,'-Q') ~=0 THEN MM.Query=TRUE;IF INDEX(MM.Switch,'-L') ~=0 THEN MM.List=TRUE
  52. IF INDEX(MM.Switch,'-U') ~=0 THEN MM.UnLinked=TRUE;IF INDEX(MM.Switch,'-H') ~=0 THEN MM.Help=TRUE
  53. IF MM.Mode='AREAFIX' THEN;DO
  54. IF INDEX(MM.Switch,'-R') ~=0 THEN MM.Rescan=TRUE;IF INDEX(MM.Switch,'-FR') ~=0 THEN MM.ForceRescan=TRUE
  55. END
  56. CALL ParseMsg(MM.FromNode)
  57. IF MM.NoPolicy.Count>1 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  58. IF MM.Help=TRUE THEN;DO
  59. DO n=0 FOR MM.Help.count;CALL AddLine(Body,Trasforma(MM.Help.n));END;CALL WriteMsg(Body,'Your Requested Help','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  60. END
  61. IF MM.Query=TRUE THEN;DO
  62. IF MM.ListStatus=FALSE THEN CALL ListAreas(MM.FromNode);CALL WriteMsg(Connected_Areas,'Your Requested Query','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  63. END
  64. IF MM.List=TRUE THEN;DO
  65. IF MM.ListStatus=FALSE THEN CALL ListAreas(MM.FromNode);CALL WriteMsg(Available_Areas,'Your Requested List','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  66. END
  67. IF MM.UnLinked=TRUE THEN;DO
  68. IF MM.ListStatus=FALSE THEN CALL ListAreas(MM.FromNode);CALL WriteMsg(Unlinked_Areas,'Your Requested Unlinked List','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  69. END
  70. RETURN
  71. ParseMsg:PROCEDURE EXPOSE MM.
  72. PARSE ARG Node
  73. DO i=0 FOR MM.Msg.Text.Count
  74. IF MM.Msg.Text.i='' THEN ITERATE
  75. IF LEFT(MM.Msg.Text.i,1)='+'|LEFT(MM.Msg.Text.i,1)='-' THEN Area=COMPRESS(MM.Msg.Text.i)
  76. ELSE PARSE UPPER VAR MM.Msg.Text.i Area Altro
  77. IF LEFT(Area,3)='---' THEN LEAVE
  78. IF LEFT(Area,1)='%' THEN;DO
  79. Linea=Area Altro
  80. IF Area='%RESCAN'|Area='%R'|Area='%FORCERESCAN'|Area='%FR'|Area='%RESCANDAYS'|Area='%RD'|Area='%FORCERESCANDAYS'|Area='%FRD' THEN MM_AddToStem MM.ExteResc 'Linea'
  81. ELSE MM_AddToStem MM.Extended 'Linea'
  82. ITERATE
  83. END
  84. IF LEFT(Area,1)='-' THEN;DO
  85. PARSE VAR Area 2 Area
  86. CALL PrintAree(Body,Area,Message(DisConnectArea(Area,Node)))
  87. END
  88. ELSE;DO
  89. IF LEFT(Area,1)='+' THEN;DO
  90. PARSE VAR Area 2 Area
  91. END
  92. CALL PrintAree(Body,Area,Message(ConnectArea(Area,Node)))
  93. END
  94. END
  95. IF MM.Body.Count>1 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  96. IF MM.Extended.Count>0 THEN;DO
  97. MM.PAStatus=FALSE
  98. DO h=0 FOR MM.Extended.Count;CALL Extended(Node,MM.Extended.h);END
  99. END
  100. IF MM.ExteResc.Count>0 THEN;DO
  101. MM.PAStatus=FALSE
  102. CALL AddLine(Body,AddReplyKludge(Body));DO h=0 FOR MM.ExteResc.Count;CALL ExtRescan(Node,MM.ExteResc.h);END;IF MM.Body.Count>1 THEN CALL WriteMsg(Body,'AreaFix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  103. END
  104. RETURN
  105. Extended:PROCEDURE EXPOSE MM.
  106. PARSE ARG Node,Keyword Line .
  107. CALL AddLine(Body,AddReplyKludge(Body))
  108. SELECT
  109. WHEN Keyword='%+ALL' THEN;DO
  110. CALL ConnectAll(Node);Subj='Connecting All Available Areas'
  111. END
  112. WHEN Keyword='%-ALL' THEN;DO
  113. CALL DisconnectAll(Node);Subj='Disconnecting All Areas'
  114. END
  115. WHEN Keyword='%INACTIVE' THEN;DO
  116. CALL Inactive(Node);Subj='Inactive All Areas'
  117. END
  118. WHEN Keyword='%ACTIVE' THEN;DO
  119. IF Activate(Node)=FALSE THEN CALL WriteMsg(Body,'You Haven`t a Inactive Areas','',MM.Address,MM.FromName,MM.FromNode,'PVT');Subj='Activate All Areas'
  120. END
  121. WHEN Keyword='%INFO'|keyword='%I' THEN;DO
  122. MM_GetNodeInfo MM.FromNode MM.NInfo
  123. IF Rc=0 THEN;DO
  124. IF MM.Banner ~='' THEN MM_ReadStem MM.Banner MM.Body APPEND
  125. PARSE VAR MM.FromNode Nodo '@' .
  126. MM.NInfo.SysPW=SUBWORD(FindNode(Nodo,'PASSWORD'),2)
  127. IF MM.NInfo.sysPW='' THEN MM.NInfo.SysPW='- No Password Set -'
  128. IF MM.NInfo.AddrDim='4' THEN MM.NInfo.AddrDim='Fido 4D'
  129. IF MM.NInfo.AddrDim='5' THEN MM.NInfo.AddrDim='Fido 5D'
  130. IF MM.NInfo.PackDim='3' THEN MM.NInfo.PackDim='Fido 2.0'
  131. IF MM.NInfo.PackDim='4' THEN MM.NInfo.PackDim='Fido 2+'
  132. IF MM.NInfo.packdim='5' THEN MM.NInfo.PackDim='Fido 2.2'
  133. IF LENGTH(MM.NInfo.PktPW)<2 THEN MM.NInfo.PKTPW='- No Password Set -'
  134. IF LENGTH(MM.NInfo.AreaFixPW)<2 THEN MM.NInfo.AreafixPW='- No Password Set -'
  135. IF LENGTH(MM.NInfo.TickPW)<2 THEN MM.NInfo.TickPW='- No Password Set -'
  136. DO n=0 FOR MM.NodeInfo.count
  137. IF INDEX(MM.NodeInfo.n,'%LISTGROUPS') ~=0 THEN;DO
  138. CALL WriteGroups();ITERATE
  139. END
  140. IF INDEX(MM.NodeInfo.n,'%LISTECHOS') ~=0 THEN;DO
  141. CALL WriteEchos(ECHO);ITERATE
  142. END
  143. IF INDEX(MM.NodeInfo.n,'%LISTTICKS') ~=0 THEN;DO
  144. CALL WriteEchos(TICK);ITERATE
  145. END
  146. CALL AddLine(Body,Trasforma(MM.NodeInfo.n))
  147. END
  148. END
  149. ELSE CALL AddLine(Body,'- Node Not Found -')
  150. Subj='Your Requested Info'
  151. END
  152. WHEN Keyword='%AVAIL'|keyword='%A' THEN;DO
  153. PARSE VAR MM.FromNode xNode '@' Domain
  154. IF MM.Banner ~='' THEN MM_ReadStem MM.Banner MM.Body APPEND
  155. MM.xStatus=FALSE
  156. DO k=0 FOR MM.BossNode.Count
  157. PARSE VAR MM.BossNode.k BossNodo '@' BossDomain BossLista .
  158. IF UPPER(BossDomain)=UPPER(Domain) THEN;DO
  159. MM_ReadStem BossLista Lst
  160. IF Rc ~=0 THEN;DO
  161. CALL WriteLog("*** Error: Couldn't Open" BossLista)
  162. RETURN
  163. END
  164. CALL PrintBan(Body,Message(AVAILABLE_UPLINK))
  165. DO i=0 FOR Lst.Count;CALL AddLine(Body,'    'Lst.i);END
  166. MM.xStatus=TRUE
  167. ITERATE
  168. END
  169. END
  170. IF MM.xStatus=FALSE THEN;DO
  171. CALL PrintBan(Body,Message(NO_AVAILABLE_UPLINK))
  172. END
  173. Subj='Your Requested AVAIL'
  174. END
  175. WHEN Keyword='%HELP'|keyword='%H' THEN;DO
  176. MM.Help=FALSE;IF MM.Banner ~='' THEN MM_ReadStem MM.Banner MM.Body APPEND
  177. DO n=0 FOR MM.Help.count;CALL AddLine(Body,Trasforma(MM.Help.n));END;Subj='Your Requested Help'
  178. END
  179. WHEN Keyword='%POLICY'|Keyword='%P' THEN;DO
  180. CALL WritePolicy(Line);Subj='Policy of 'Line
  181. END
  182. WHEN Keyword='%RESCANALL'|keyword='%RA'|Keyword='%FORCERESCANALL'|Keyword='%FRA' THEN;DO
  183. IF MM.Mode='AREAFIX' THEN;DO
  184. IF Keyword='%FORCERESCANALL'|Keyword='%FRA' THEN MM.ForceRescan=TRUE
  185. MM_GetNodeInfo Node Info
  186. DO i=0 FOR Info.GroupCount
  187. MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  188. DO n=0 FOR Aree.Count
  189. IF GetAreaType(Aree.n.Area)='MAIL' THEN ITERATE
  190. IF IsConnected(Aree.n.Area,Node)=TRUE THEN;DO
  191. CALL PrintAree(Body,Aree.n.Area,Message(Rescan(Node,Aree.n.Area)))
  192. END
  193. END
  194. END
  195. Subj='Areafix Report'
  196. END
  197. END
  198. WHEN Keyword='%QUERY'|Keyword='%Q' THEN;DO
  199. MM.Query=FALSE;IF MM.ListStatus=FALSE THEN CALL ListAreas(Node);CALL WriteMsg(Connected_Areas,'Your Requested Query','',MM.Address,MM.FromName,MM.FromNode,'PVT');RETURN
  200. END
  201. WHEN Keyword='%LIST'|Keyword='%L' THEN;DO
  202. MM.List=FALSE;IF MM.ListStatus=FALSE THEN CALL ListAreas(Node);CALL WriteMsg(Available_Areas,'Your Requested List','',MM.Address,MM.FromName,MM.FromNode,'PVT');RETURN
  203. END
  204. WHEN Keyword='%UNLINKED'|Keyword='%U' THEN;DO
  205. MM.UnLinked=FALSE;IF MM.ListStatus=FALSE THEN CALL ListAreas(Node);CALL WriteMsg(Unlinked_Areas,'Your Requested Unlinked List','',MM.Address,MM.FromName,MM.FromNode,'PVT');RETURN
  206. END
  207. OTHERWISE;DO
  208. CALL AddLine(Body,'');CALL AddLine(Body,'Command' Keyword 'not supported')
  209. CALL AddLine(Body,'');CALL AddLine(Body,'Please Use %HELP Command ....')
  210. CALL AddLine(Body,'');CALL AddLine(Body,'         MM_AreaFixPlus')
  211. CALL AddLine(Body,'');Subj='Sorry. Command not supported...'
  212. END
  213. END
  214. IF MM.Body.Count>1 THEN CALL WriteMsg(Body,Subj,'',MM.Address,MM.FromName,MM.FromNode,'PVT')
  215. RETURN
  216. ExtRescan:PROCEDURE EXPOSE MM.
  217. PARSE ARG Node,Keyword Line
  218. SELECT
  219. WHEN Keyword='%RESCAN'|keyword='%R'|Keyword='%FORCERESCAN'|Keyword='%FR' THEN;DO
  220. IF MM.Mode='AREAFIX' THEN;DO
  221. IF Keyword='%FORCERESCAN'|Keyword='%FR' THEN MM.ForceRescan=TRUE
  222. CALL PrintAree(Body,Line,Message(Rescan(Node,Line)))
  223. END
  224. END
  225. WHEN Keyword='%RESCANDAYS'|keyword='%RD'|Keyword='%FORCERESCANDAYS'|Keyword='%FRD' THEN;DO
  226. IF MM.Mode='AREAFIX' THEN;DO
  227. IF Keyword='%FORCERESCANDAYS'|Keyword='%FRD' THEN MM.ForceRescan=TRUE
  228. MM.Days=WORD(Line,2)
  229. Line=WORD(Line,1)
  230. IF MM.Days='' THEN MM.Days=0
  231. CALL PrintAree(Body,Line,Message(Rescan(Node,Line)))
  232. END
  233. END
  234. OTHERWISE NOP
  235. END
  236. RETURN
  237. ConnectAll:PROCEDURE EXPOSE MM.
  238. PARSE ARG Node
  239. MM_GetNodeInfo Node Info
  240. IF Rc ~=0 THEN RETURN
  241. CALL WriteLog('Connect All avaiable areas to Node:' Node)
  242. TotNumAreas=0
  243. DO i=0 FOR Info.GroupCount
  244. NumAreas=0
  245. MM.Status=FALSE
  246. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  247. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  248. DO n=0 FOR Aree.Count
  249. IF GetAreaType(Aree.n.AREA)='MAIL' THEN ITERATE
  250. IF IsConnected(Aree.n.AREA,Node)=FALSE THEN;DO
  251. CALL PrintHeadAree(Aree.n.AREA,Info.GroupName.i,Message(ConnectArea(Aree.n.AREA,Node)))
  252. NumAreas=NumAreas+1
  253. TotNumAreas=TotNumAreas+1
  254. END
  255. END
  256. IF MM.Status=TRUE THEN;DO
  257. CALL PrintTail(NumAreas)
  258. CALL AddLine(Body,'')
  259. END
  260. END
  261. IF TotNumAreas=0 THEN;DO
  262. CALL PrintBan(Body,Message(ALL_CONNECTED))
  263. END
  264. RETURN
  265. DisconnectAll:PROCEDURE EXPOSE MM.
  266. PARSE ARG Node
  267. MM_GetNodeInfo Node Info
  268. IF Rc ~=0 THEN RETURN
  269. CALL WriteLog('Disconnecting all areas to node:' Node)
  270. TotNumAreas=0
  271. DO i=0 FOR Info.GroupCount
  272. NumAreas=0
  273. MM.Status=FALSE
  274. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  275. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  276. DO n=0 FOR Aree.Count
  277. IF IsConnected(Aree.n.AREA,Node)=TRUE THEN;DO
  278. CALL PrintHeadAree(Aree.n.AREA,Info.GroupName.i,Message(DisconnectArea(Aree.n.AREA,Node)))
  279. NumAreas=NumAreas+1
  280. TotNumAreas=TotNumAreas+1
  281. END
  282. END
  283. IF MM.Status=TRUE THEN;DO
  284. CALL PrintTail(NumAreas)
  285. CALL AddLine(Body,'')
  286. END
  287. END
  288. IF TotNumAreas=0 THEN;DO
  289. CALL PrintBan(Body,Message(NO_AREAS_CONNECTED))
  290. END
  291. RETURN
  292. ListAreas:PROCEDURE EXPOSE MM.
  293. PARSE ARG Node
  294. CALL WriteLog('Creating Areas Lists for Node: ' Node)
  295. MM_GetNodeInfo Node Info
  296. IF Rc=0 THEN;DO
  297. MM.HCTotal=0;MM.HATotal=0
  298. MM.HUTotal=0;MM.HCTotale=0
  299. MM.HATotale=0;MM.HUTotale=0
  300. MM.HALink=0;MM.HALinks=0
  301. MM.ListStatus=TRUE
  302. MM.Connected_Areas.Count=0
  303. MM.Available_Areas.Count=0
  304. MM.Unlinked_Areas.Count=0
  305. CALL AddLine(Connected_Areas,AddReplyKludge(Connected_Areas))
  306. CALL AddLine(Available_Areas,AddReplyKludge(Available_Areas))
  307. CALL AddLine(Unlinked_Areas,AddReplyKludge(Unlinked_Areas))
  308. IF MM.Banner ~='' THEN;DO
  309. MM_ReadStem MM.Banner MM.Connected_Areas APPEND
  310. MM_ReadStem MM.Banner MM.Available_Areas APPEND
  311. MM_ReadStem MM.Banner MM.Unlinked_Areas APPEND
  312. END
  313. CALL PrintBan(Connected_Areas,Message(LINKED_LIST))
  314. CALL PrintBan(Available_Areas,Message(AVAILABLE_LIST))
  315. CALL PrintBan(Unlinked_Areas,Message(UNLINKED_LIST))
  316. DO i=0 FOR Info.GroupCount
  317. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  318. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  319. CALL WriteFooter()
  320. MM.GAree.Count=0
  321. Gruppo=Info.GroupName.i
  322. DO y=0 FOR Aree.Count
  323. MM.GAree.y=Aree.y.AREA
  324. END
  325. MM.GAree.Count=Aree.Count
  326. MM_SortStem MM.GAree
  327. DO n=0 FOR MM.GAree.Count
  328. AreaName=MM.GAree.n
  329. Tab='   '
  330. IF GetAreaType(AreaName)='MAIL' THEN ITERATE
  331. IF MM.Mode='AREAFIX' THEN;DO
  332. MM_GetAreaInfo AreaName Info
  333. IF LENGTH(Info.Desc)<2 THEN Info.Desc=Info.Name
  334. END
  335. ELSE;DO
  336. MM_GetTickAreaInfo AreaName Info
  337. IF LENGTH(Info.Desc)<2 THEN Info.Desc='Description Not Available'
  338. END
  339. Info.Desc=LEFT(Info.Desc,36)
  340. IsC=IsConnected(AreaName,Node)
  341. CkL=CheckLevel(Node,AreaName)
  342. IF IsC=TRUE THEN;DO
  343. MM.HCTotal=MM.HCTotal+1
  344. IF MM.HCStatus=FALSE THEN CALL HeadAreas(Connected_Areas,Gruppo,CONNECTED)
  345. Testo=Tab||PadR(2,AreaName,29)'  'Info.Desc' 'CkL
  346. MM_AddToStem MM.Connected_Areas 'Testo'
  347. END
  348. IF IsC=TRUE THEN;DO
  349. Tab='  *'
  350. MM.HALink=MM.HALink+1
  351. END
  352. MM.HATotal=MM.HATotal+1
  353. IF MM.HAStatus=FALSE THEN CALL HeadAreas(Available_Areas,Gruppo,AVAILABLE)
  354. Testo=Tab||PadR(2,AreaName,29)'  'Info.Desc' 'CkL
  355. MM_AddToStem MM.Available_Areas 'Testo'
  356. IF IsC=FALSE THEN;DO
  357. MM.HUTotal=MM.HUTotal+1
  358. IF MM.HUStatus=FALSE THEN CALL HeadAreas(Unlinked_Areas,Gruppo,UNLINKED)
  359. Testo=Tab||PadR(2,AreaName,29)'  'Info.Desc' 'CkL
  360. MM_AddToStem MM.Unlinked_Areas 'Testo'
  361. END
  362. END
  363. END
  364. CALL WriteFooter()
  365. CALL AddLine(Connected_Areas,'')
  366. CALL AddLine(Connected_Areas,'    Total Connected: 'PadR(2,MM.HCTotale,4)' Area(s)')
  367. CALL AddLine(Connected_Areas,'')
  368. CALL AddLine(Connected_Areas,'    'Message(END_LISTS))
  369. CALL AddLine(Available_Areas,'')
  370. CALL AddLine(Available_Areas,'    Total Available: 'PadR(2,MM.HATotale,4)' Area(s)')
  371. CALL AddLine(Available_Areas,'    Total Connected: 'PadR(2,MM.HALinks,4)' Area(s)')
  372. CALL AddLine(Available_Areas,'')
  373. CALL AddLine(Available_Areas,'  'Message(MEANS_LINKED))
  374. CALL AddLine(Available_Areas,'')
  375. CALL AddLine(Available_Areas,'    'Message(END_LISTS))
  376. CALL AddLine(Unlinked_Areas,'')
  377. CALL AddLine(Unlinked_Areas,'    Total UnLinked: 'PadR(2,MM.HUTotale,4)' Area(s)')
  378. CALL AddLine(Unlinked_Areas,'')
  379. CALL AddLine(Unlinked_Areas,'    'Message(END_LISTS))
  380. END
  381. RETURN
  382. WriteFooter:PROCEDURE EXPOSE MM.
  383. MM.HCStatus=FALSE;MM.HAStatus=FALSE;MM.HUStatus=FALSE
  384. IF MM.HCTotal>0 THEN;DO
  385. CALL AddLine(Connected_Areas,'  'COPIES('~',76))
  386. CALL AddLine(Connected_Areas,'    Available: 'MM.HCTotal' Area(s)')
  387. CALL AddLine(Connected_Areas,'')
  388. MM.HCTotale=MM.HCTotale+MM.HCTotal;MM.HCTotal=0
  389. END
  390. IF MM.HATotal>0 THEN;DO
  391. CALL AddLine(Available_Areas,'  'COPIES('~',76))
  392. CALL AddLine(Available_Areas,'    Available: 'PadR(2,MM.HATotal,4)' Area(s)')
  393. CALL AddLine(Available_Areas,'    Connected: 'PadR(2,MM.HALink,4)' Area(s)')
  394. CALL AddLine(Available_Areas,'')
  395. MM.HATotale=MM.HATotale+MM.HATotal;MM.HALinks=MM.HALinks+MM.HALink
  396. MM.HATotal=0;MM.HALink=0
  397. END
  398. IF MM.HUTotal>0 THEN;DO
  399. CALL AddLine(Unlinked_Areas,'  'COPIES('~',76))
  400. CALL AddLine(Unlinked_Areas,'    Available: 'MM.HUTotal' Area(s)')
  401. CALL AddLine(Unlinked_Areas,'')
  402. MM.HUTotale=MM.HUTotale+MM.HUTotal;MM.HUTotal=0
  403. END
  404. RETURN
  405. HeadAreas:PROCEDURE EXPOSE MM.
  406. PARSE ARG Stem,Gruppo,Lista
  407. CALL AddLine(Stem,'')
  408. CALL AddLine(Stem,'    GROUP : 'Gruppo)
  409. CALL AddLine(Stem,'    ~~~~~~~~'COPIES('~',LENGTH(Gruppo)))
  410. CALL AddLine(Stem,'')
  411. CALL AddLine(Stem,'    Area:                           Description:                       Status:')
  412. CALL AddLine(Stem,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  413. IF Lista='CONNECTED' THEN MM.HCStatus=TRUE
  414. IF Lista='AVAILABLE' THEN MM.HAStatus=TRUE
  415. IF Lista='UNLINKED' THEN MM.HUStatus=TRUE
  416. RETURN
  417. Inactive:PROCEDURE EXPOSE MM.
  418. PARSE ARG Node
  419. CALL WriteLog('Inactive all areas to node' node)
  420. PARSE VAR Node Zone ':' Net '/' Nodo '.' Point '@' Domain
  421. PassiFile=MM.PathCfg'INACTIVE/'Zone'.'Net'.'Nodo'.'Point'.'Domain'.'MM.Mode
  422. Action=''
  423. IF EXISTS(PassiFile) THEN Action='APPEND'
  424. MM.InactiveAll.Count=0
  425. MM_GetNodeInfo Node Info
  426. IF Rc=0 THEN;DO
  427. CALL PrintBan(Body,Message(INACTIVE_ALL))
  428. DO i=0 FOR Info.GroupCount
  429. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  430. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  431. DO n=0 FOR Aree.Count
  432. IF IsConnected(Aree.n.AREA,Node)=TRUE THEN;DO
  433. CALL PrintAree(Body,Aree.n.Area,Message(DisConnectArea(Aree.n.Area,Node)))
  434. Testo=STRIP(Aree.n.AREA)
  435. MM_AddToStem MM.InactiveAll 'Testo'
  436. END
  437. END
  438. END
  439. MM_WriteStem PassiFile MM.InactiveAll Action
  440. CALL CLOSE('out')
  441. END
  442. MM.PAStatus=FALSE;CALL PrintBan(Body,Message(INACTIVE_MESS))
  443. RETURN
  444. Activate:PROCEDURE EXPOSE MM.
  445. PARSE ARG Node
  446. CALL WriteLog('Activate all areas to node:' node)
  447. PARSE VAR Node Zone ':' Net '/' Nodo '.' Point '@' Domain
  448. PassiFile=MM.PathCfg'INACTIVE/'Zone'.'Net'.'Nodo'.'Point'.'Domain'.'MM.Mode
  449. IF ~EXISTS(PassiFile) THEN;DO
  450. DO n=0 FOR MM.NotPass.Count
  451. CALL AddLine(Body,Trasforma(MM.NotPass.n))
  452. END
  453. RETURN FALSE
  454. END
  455. CALL PrintBan(Body,Message(ACTIVE_ALL))
  456. MM_ReadStem PassiFile InacAree
  457. DO j=0 FOR InacAree.Count
  458. CALL PrintAree(Body,InacAree.j,Message(ConnectArea(InacAree.j,Node)))
  459. END
  460. MM.PAStatus=FALSE;MM_DeleteFile PassiFile
  461. RETURN TRUE
  462. Rescan:PROCEDURE EXPOSE MM.
  463. PARSE ARG Node,Area
  464. Res=IsInGroup(Area,Node)
  465. SELECT
  466. WHEN Res=10 THEN;DO
  467. CALL WriteLog('Nodo:' Node 'Rescan Area' Area '- Status: AREA NOT ECHO')
  468. RETURN 'AREA_NOT_ECHO'
  469. END
  470. WHEN Res=5 THEN;DO
  471. CALL WriteLog('Nodo:' Node 'Rescan Area' Area '- Status: UNKNOWN AREA')
  472. RETURN 'AREA_UNKNOWN'
  473. END
  474. WHEN Res=0 THEN;DO
  475. CALL WriteLog('Nodo:' Node 'Rescan Area' Area '- Status: AREA NOT AVAILABLE')
  476. RETURN 'AREA_NOT_AVAILABLE'
  477. END
  478. OTHERWISE NOP
  479. END
  480. IF MM.Mode='AREAFIX' THEN;DO
  481. MM_GetAreaInfo Area Info
  482. IF Info.MBase='PTHRO' THEN;DO
  483. RETURN 'NO_RESCAN_PTHRO'
  484. END
  485. END
  486. IF MM.ForceRescan=TRUE THEN MM_Rescan Area Node MM.Days FORCED
  487. ELSE MM_Rescan Area Node MM.Days
  488. RETURN 'AREA_RESCANNED'
  489. ConnectArea:PROCEDURE EXPOSE MM.
  490. PARSE ARG Area,Node
  491. Res=IsInGroup(Area,Node)
  492. Link=''
  493. Scan=''
  494. SELECT
  495. WHEN Res=10 THEN;DO
  496. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA NOT ECHO')
  497. RETURN 'AREA_NOT_ECHO'
  498. END
  499. WHEN Res=5 THEN;DO
  500. IF MM.Mode='AREAFIX' THEN;DO
  501. DO w=0 FOR MM.SpecialNode.Count
  502. PARSE VAR MM.SpecialNode.w Nodo '@' Dom Path Addr MsgBase GroupName GroupLevel
  503. PARSE VAR Node SNode '@' Domain
  504. IF Nodo=SNode THEN;DO
  505. SELECT
  506. WHEN UPPER(MsgBase)='INDEXED' THEN MsgBase='IDX'
  507. WHEN UPPER(MsgBase)='COMPRESSED' THEN MsgBase='COMP'
  508. WHEN UPPER(MsgBase)='PASSTHROUGH' THEN MsgBase='PTHRO'
  509. OTHERWISE NOP
  510. END
  511. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: UNKNOWN AREA (Found a Special Node)')
  512. DO k=0 FOR MM.BossNode.Count
  513. PARSE VAR MM.BossNode.k BossNodo '@' BossDomain BossLista BossPw
  514. BossPw=STRIP(BossPw)
  515. BossLista=STRIP(BossLista)
  516. IF UPPER(BossDomain)=UPPER(Domain) THEN;DO
  517. MM_ReadStem BossLista Lst
  518. IF Rc ~=0 THEN;DO
  519. CALL WriteLog("*** Error: Couldn't open" BossLista)
  520. ITERATE
  521. END
  522. MM_SearchInStem Lst LstResp Area'#?' STR
  523. IF LstResp.Count>0 THEN;DO
  524. NodoArea=BossNodo'@'BossDomain MM.Mail Node Addr SUBWORD(LstResp.0,1,1) BossPw
  525. MM_AddToStem MM.Export 'NodoArea'
  526. CALL WriteLog(' --> OK! Found Area in list  -  Send Message to UpLink ')
  527. MM_CreateArea Area Path Addr MsgBase GroupName GroupLevel BossNodo
  528. MM_AddAreaNode Area Node
  529. MM.Process=TRUE
  530. RETURN 'AREA_REQUESTED_TO_BOSS'
  531. END
  532. CALL WriteLog(' --> Area Not Found in "'BossLista'"')
  533. END
  534. END
  535. RETURN 'AREA_UNKNOWN'
  536. END
  537. END
  538. END
  539. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: UNKNOWN AREA')
  540. RETURN 'AREA_UNKNOWN'
  541. END
  542. WHEN Res=0 THEN;DO
  543. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA NOT AVAILABLE')
  544. RETURN 'AREA_NOT_AVAILABLE'
  545. END
  546. OTHERWISE NOP
  547. END
  548. IF MM.Mode='AREAFIX' THEN;DO
  549. IF CheckLevel(Node,Area)='R' THEN MM_AddAreaNode Area Node 'READONLY'
  550. ELSE MM_AddAreaNode Area Node
  551. END
  552. ELSE;DO
  553. IF CheckLevel(Node,Area)='R' THEN MM_AddTickAreaNode Area Node 'READONLY'
  554. ELSE MM_AddTickAreaNode Area Node
  555. END
  556. SELECT
  557. WHEN Rc=0 THEN;DO
  558. MM.Process=TRUE
  559. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA LINKED')
  560. Link='_LINKED'
  561. IF MM.AutoPolicy=TRUE THEN;DO
  562. CALL WritePolicy(Area)
  563. END
  564. END
  565. WHEN Rc=1 THEN;DO
  566. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA ALREADY LINKED')
  567. Link='_YET_LINKED'
  568. END
  569. OTHERWISE NOP
  570. END
  571. IF MM.Mode='AREAFIX' THEN;DO
  572. MM_GetAreaInfo Area Info
  573. IF Info.MBase='PTHRO' THEN;DO
  574. RETURN 'AREA'Link||'_NORESCANNED'
  575. END
  576. SELECT
  577. WHEN MM.Rescan=TRUE THEN;DO
  578. MM_Rescan Area Node MM.Days
  579. Scan='_RESCANNED'
  580. END
  581. WHEN MM.ForceRescan=TRUE THEN;DO
  582. MM_Rescan Area Node MM.Days FORCED
  583. Scan='_RESCANNED'
  584. END
  585. OTHERWISE NOP
  586. END
  587. END
  588. RETURN 'AREA'Link||Scan
  589. DisconnectArea:PROCEDURE EXPOSE MM.
  590. PARSE ARG Area,Node
  591. Res=IsInGroup(Area,Node)
  592. SELECT
  593. WHEN Res=10 THEN;DO
  594. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA NOT ECHO')
  595. RETURN 'AREA_NOT_ECHO'
  596. END
  597. WHEN Res=5 THEN;DO
  598. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: UNKNOWN AREA')
  599. RETURN 'AREA_UNKNOWN'
  600. END
  601. WHEN Res=0 THEN;DO
  602. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA NOT AVAILABLE')
  603. RETURN 'AREA_NOT_AVAILABLE'
  604. END
  605. OTHERWISE
  606. END
  607. IF MM.Mode='AREAFIX' THEN MM_DelAreaNode Area Node
  608. ELSE MM_DelTickAreaNode Area Node
  609. SELECT
  610. WHEN Rc=0 THEN;DO
  611. MM.Process=TRUE
  612. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA UNLINKED')
  613. RETURN 'AREA_UNLINKED'
  614. END
  615. WHEN Rc=1 THEN;DO
  616. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA ALREADY UNLINKED')
  617. RETURN 'AREA_YET_UNLINKED'
  618. END
  619. END
  620. RETURN 0
  621. CheckLevel:PROCEDURE EXPOSE MM.
  622. PARSE ARG Node,Area
  623. Flags=''
  624. IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info
  625. ELSE MM_GetTickAreaInfo Area Info
  626. MM_GetNodeInfo Node NodeInfo
  627. DO i=0 FOR NodeInfo.GroupCount
  628. IF (NodeInfo.GroupName.i=Info.Group)&(Info.Level<NodeInfo.GroupLevel.i) THEN;DO
  629. Flags='R/W'
  630. LEAVE
  631. END
  632. END
  633. IF INDEX(Flags,'R/W')=0 THEN Flags='R'
  634. IF MM.AvailPolicy=TRUE THEN;DO
  635. IF EXISTS(MM.PolicyPath||MM.Mode'/'Area) THEN Flags=Flags||'/P'
  636. END
  637. RETURN Flags
  638. PrintHeadAree:PROCEDURE EXPOSE MM.
  639. PARSE ARG AreaName,Group,Altro
  640. IF MM.Status=FALSE THEN;DO
  641. CALL AddLine(Body,'')
  642. CALL AddLine(Body,'   GROUP: 'Group)
  643. CALL AddLine(Body,'   ~~~~~~~~'COPIES('~',LENGTH(Group)))
  644. CALL AddLine(Body,'')
  645. CALL AddLine(Body,'  Area:                                 Status:')
  646. CALL AddLine(Body,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  647. MM.Status=TRUE
  648. END
  649. CALL AddLine(Body,' 'PadR(2,AreaName,35)'  'Altro)
  650. RETURN
  651. PrintAree:PROCEDURE EXPOSE MM.
  652. PARSE ARG Stem,AreaName,Altro
  653. IF MM.PAStatus=FALSE THEN;DO
  654. CALL AddLine(Stem,'')
  655. CALL AddLine(Stem,'  Area:                                 Status:')
  656. CALL AddLine(Stem,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  657. MM.PAStatus=TRUE
  658. END
  659. CALL AddLine(Stem,' 'PadR(2,AreaName,35)'  'Altro)
  660. RETURN
  661. Replace:PROCEDURE
  662. PARSE ARG String,New,Old;DO WHILE INDEX(String,Old) ~=0;INTERPRET "PARSE VAR String l '"Old"' r";String=l||New||r;END;RETURN String
  663. Trasforma:PROCEDURE EXPOSE MM.
  664. PARSE ARG String
  665. IF INDEX(String,'%')=0 THEN RETURN String
  666. String=Replace(String,MM.FromNode,'%ORIGNODE');String=Replace(String,MM.ToNode,'%DESTNODE')
  667. String=Replace(String,MM.SysopName,'%SYSOPNAME');String=Replace(String,MM.FromName,'%NAME')
  668. String=Replace(String,MM.FromFirst,'%FIRST');String=Replace(String,MM.PassWord,'%PASSWORD')
  669. String=Replace(String,MM.Sysop,'%SYSOP');String=Replace(String,'0d'x,'%\')
  670. String=Replace(String,MM.SpecialAddr,'%SPECIALNODE');String=Replace(String,MM.Info.Name,'%TAGNAME')
  671. String=Replace(String,MM.Info.Addr,'%ADDRESS');String=Replace(String,MM.Info.Path,'%PATH')
  672. String=Replace(String,MM.Info.MBase,'%MESSAGEBASE');String=Replace(String,MM.Info.Type,'%AREATYPE')
  673. String=Replace(String,MM.Info.Group,'%GROUPNAME');String=Replace(String,MM.Info.Level,'%GROUPLEVEL')
  674. String=Replace(String,MM.NInfo.AddrDim,'%ADDRDIM');String=Replace(String,MM.NInfo.PackDim,'%PACKDIM')
  675. String=Replace(String,MM.NInfo.EchoFlavor,'%ECHOFLAVOR');String=Replace(String,MM.NInfo.TickFlavor,'%TICKFLAVOR')
  676. String=Replace(String,MM.NInfo.PktPW,'%PKTPW');String=Replace(String,MM.NInfo.AreaFixPW,'%AREAFIXPW')
  677. String=Replace(String,MM.NInfo.TickPW,'%TICKPW');String=Replace(String,MM.NInfo.SysPW,'%SESSIONPW')
  678. RETURN String
  679. PrintBan:PROCEDURE EXPOSE MM.
  680. PARSE ARG Stem,Line;CALL AddLine(Stem,'');CALL AddLine(Stem,'  'Line);CALL AddLine(Stem,'  'COPIES('~',LENGTH(Line)));CALL AddLine(Stem,'');RETURN
  681. GetAreaType:PROCEDURE EXPOSE MM.
  682. PARSE ARG Area;IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info;ELSE Info.Type='TICK';RETURN Info.Type
  683. IsConnected:PROCEDURE EXPOSE MM.
  684. PARSE ARG Area,Nodo;IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info;ELSE MM_GetTickAreaInfo Area Info;IF Rc ~=0 THEN RETURN FALSE;MM_SearchInStem Info.Node Resp Nodo'#?' STR;IF Resp.Count=1 THEN RETURN TRUE;RETURN FALSE
  685. Message:PROCEDURE EXPOSE MM.
  686. PARSE ARG Chiave;DO n=0 FOR MM.Messages.Count;PARSE VAR MM.Messages.n Key Frase;IF Chiave=STRIP(Key) THEN RETURN TRASFORMA(STRIP(Frase));END;RETURN ''
  687. AddLine:PROCEDURE EXPOSE MM.
  688. PARSE ARG Stem,Line;INTERPRET "Cont = MM."Stem".Count";INTERPRET "MM."Stem".Cont = Line";INTERPRET "MM."Stem".Count = Cont +1";RETURN
  689. PadR:PROCEDURE
  690. PARSE ARG Modo,Stringa,Len;IF Len<LENGTH(Stringa) THEN RETURN Stringa;IF Modo=1 THEN RETURN Stringa COPIES(' ',Len-LENGTH(Stringa));IF Modo=2 THEN RETURN ' 'Stringa COPIES('.',Len-LENGTH(Stringa));IF Modo=3 THEN RETURN COPIES(' ',Len-LENGTH(Stringa))Stringa
  691. PrintTail:PROCEDURE EXPOSE MM.
  692. PARSE ARG NumAree;CALL AddLine(Body,'  'COPIES('~',76));CALL AddLine(Body,'    Total:' NumAree 'Areas');RETURN
  693. IsInGroup:PROCEDURE EXPOSE MM.
  694. PARSE ARG Area,Node
  695. MM.ReadOnly=FALSE
  696. IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info
  697. ELSE MM_GetTickAreaInfo Area Info
  698. IF Rc ~=0 THEN RETURN 5
  699. IF MM.Mode='AREAFIX' THEN;DO
  700. IF Info.Type='MAIL' THEN RETURN 10
  701. END
  702. MM_GetNodeInfo Node NodeInfo
  703. IF Rc ~=0 THEN RETURN 0
  704. IF MM.Force=TRUE THEN RETURN 1
  705. DO i=0 FOR NodeInfo.GroupCount
  706. IF (NodeInfo.GroupName.i=Info.Group)&(Info.Level<=NodeInfo.GroupLevel.i) THEN RETURN 1
  707. END
  708. RETURN 0
  709. WriteGroups:PROCEDURE EXPOSE MM.
  710. CALL AddLine(Body,' -----------------------------------------------------------')
  711. CALL AddLine(Body,' Groups                               Levels')
  712. CALL AddLine(Body,' -----------------------------------------------------------')
  713. DO i=0 FOR MM.NInfo.GroupCount
  714. CALL AddLine(Body,' 'PadR(1,MM.NInfo.GroupName.i,35) MM.NInfo.GroupLevel.i)
  715. END
  716. CALL AddLine(Body,' -----------------------------------------------------------')
  717. RETURN
  718. WriteEchos:PROCEDURE EXPOSE MM.
  719. PARSE ARG Modo
  720. CALL AddLine(Body,' +--------------------------+-------------------------------+----------------+')
  721. CALL AddLine(Body,' | Area                     | Groups                 Levels | Address        |')
  722. CALL AddLine(Body,' +--------------------------+-------------------------------+----------------+')
  723. IF Modo='ECHO' THEN;DO
  724. MM_SortStem MM.NInfo.Area
  725. IF MM.NInfo.Area.Count>0 THEN;DO
  726. DO i=0 FOR MM.NInfo.Area.Count
  727. MM_GetAreaInfo MM.NInfo.Area.i Area
  728. PARSE VAR Area.Addr Area.Addr '@' .
  729. CALL AddLine(Body,'   'PadR(1,MM.NInfo.Area.i,25) PadR(1,Area.Group,24) PadR(1,Area.Level,3)'  'Area.Addr)
  730. END
  731. END
  732. ELSE CALL AddLine(Body,'   'PadR(1,'Nothing...',25))
  733. CALL AddLine(Body,' +--------------------------+')
  734. CALL AddLine(Body,' | Active Echo Alias        |')
  735. CALL AddLine(Body,' +--------------------------+')
  736. DO o=0 FOR MM.AliasAreaFix.Count
  737. CALL AddLine(Body,'   'PadR(1,MM.AliasAreaFix.o,25))
  738. END
  739. END
  740. ELSE;DO
  741. MM_SortStem MM.NInfo.TickArea
  742. IF MM.NInfo.TickArea.Count>0 THEN;DO
  743. DO i=0 FOR MM.NInfo.TickArea.Count
  744. MM_GetTickAreaInfo MM.NInfo.TickArea.i Area
  745. PARSE VAR Area.Addr Area.Addr '@' .
  746. CALL AddLine(Body,'   'PadR(1,MM.NInfo.TickArea.i,25) PadR(1,Area.Group,24) PadR(1,Area.Level,3)'  'Area.Addr)
  747. END
  748. END
  749. ELSE CALL AddLine(Body,'   'PadR(1,'Nothing...',25))
  750. CALL AddLine(Body,' +--------------------------+')
  751. CALL AddLine(Body,' | Active File Alias        |')
  752. CALL AddLine(Body,' +--------------------------+')
  753. DO o=0 FOR MM.AliasRaid.Count
  754. CALL AddLine(Body,'   'PadR(1,MM.AliasRaid.o,25))
  755. END
  756. END
  757. CALL AddLine(Body,' -----------------------------------------------------------------------------')
  758. RETURN
  759. FindAddr:PROCEDURE EXPOSE MM.
  760. PARSE ARG Nodo;MM_GetNearestAddr Nodo 'MM.Address';RETURN MM.Address
  761. ReadCfg:PROCEDURE EXPOSE MM.
  762. CALL WriteLog(MM.PrgName '- Started')
  763. IF ~SHOW('l',"rexxsupport.library") THEN;DO
  764. IF ~ADDLIB("rexxsupport.library",0,-30,0) THEN;DO
  765. SAY "Could not open rexxsupport.library"
  766. CALL Errore('10')
  767. END
  768. END
  769. IF(~SHOW('l',"traplist.library")) THEN;DO
  770. IF(~ADDLIB("traplist.library",0,-30,0)) THEN;DO
  771. SAY "Could not open traplist.library"
  772. CALL Errore('10')
  773. END
  774. END
  775. MM.PathCfg='MM:Config/';MM.PolicyPath='MM:Config/Policy/';MM.Banner=''
  776. MM.AutoPolicy=FALSE;MM.AutoExport=FALSE
  777. MM.ProcessPassTHRO=FALSE;MM.AvailPolicy=FALSE
  778. MM.Process=FALSE;MM.Export.Count=0
  779. MM.Messages.Count=0;MM.NewArea.Count=0
  780. MM.Help.Count=0;MM.NodeInfo.Count=0
  781. MM.Unknown.Count=0;MM.BadPass.Count=0
  782. MM.NotPass.Count=0;MM.BossNode.Count=0
  783. MM.SpecialNode.Count=0;MM.CheckPThro.Count=0
  784. MM.AliasAreaFix.Count=0;MM.AliasRaid.Count=0
  785. MM_ReadStem MM.PathCfg||'MM_AreaFixPlus.Cfg' Config
  786. IF Rc ~=0 THEN;DO
  787. SAY 'Could not open "'||MM.PathCfg||'MM_AreaFixPlus.Cfg"'
  788. CALL Errore('10')
  789. END
  790. DO c=0 FOR Config.Count
  791. IF (LEFT(Config.c,1) ~=';')&Config.c ~='' THEN;DO
  792. PARSE VAR Config.c Keyword Linea
  793. SELECT
  794. WHEN Keyword='#BANNER' THEN MM.Banner=STRIP(Linea)
  795. WHEN Keyword='#POLICYPATH' THEN MM.PolicyPath=STRIP(Linea)
  796. WHEN Keyword='#TASKPRI' THEN PRAGMA('P',Linea)
  797. WHEN Keyword='#AUTOPOLICY' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.AutoPolicy=TRUE
  798. WHEN Keyword='#AVAILPOLICY' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.AvailPolicy=TRUE
  799. WHEN Keyword='#AUTOEXPORT' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.AutoExport=TRUE
  800. WHEN Keyword='#PROCESSPASSTHRO' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.ProcessPassTHRO=TRUE
  801. WHEN Keyword='#ALIASAREAFIX' THEN;DO
  802. Cont=MM.AliasAreaFix.Count;MM.AliasAreaFix.Cont=STRIP(Linea);MM.AliasAreaFix.Count=Cont+1
  803. END
  804. WHEN Keyword='#ALIASRAID' THEN;DO
  805. Cont=MM.AliasRaid.Count;MM.AliasRaid.Cont=STRIP(Linea);MM.AliasRaid.Count=Cont+1
  806. END
  807. WHEN Keyword='#BOSSNODE' THEN;DO
  808. Cont=MM.BossNode.Count;MM.BossNode.Cont=STRIP(Linea);MM.BossNode.Count=Cont+1
  809. END
  810. WHEN Keyword='#SPECIALNODE' THEN;DO
  811. Cont=MM.SpecialNode.Count;MM.SpecialNode.Cont=STRIP(Linea);MM.SpecialNode.Count=Cont+1
  812. END
  813. WHEN Keyword='#CHECKPASSTHRO' THEN;DO
  814. Cont=MM.CheckPThro.Count;MM.CheckPThro.Cont=STRIP(Linea);MM.CheckPThro.Count=Cont+1
  815. END
  816. WHEN Keyword='#HELP' THEN;DO
  817. Cont=MM.Help.Count;MM.Help.Cont=Linea;MM.Help.Count=Cont+1
  818. END
  819. WHEN Keyword='#NODE_UNKNOWN' THEN;DO
  820. Cont=MM.Unknown.Count;MM.Unknown.Cont=Linea;MM.Unknown.Count=Cont+1
  821. END
  822. WHEN Keyword='#BAD_PASSWORD' THEN;DO
  823. Cont=MM.BadPass.Count;MM.BadPass.Cont=Linea;MM.BadPass.Count=Cont+1
  824. END
  825. WHEN Keyword='#NOT_INACTIVE' THEN;DO
  826. Cont=MM.NotPass.Count;MM.NotPass.Cont=Linea;MM.NotPass.Count=Cont+1
  827. END
  828. WHEN Keyword='#NEW_AREA' THEN;DO
  829. Cont=MM.NewArea.Count;MM.NewArea.Cont=Linea;MM.NewArea.Count=Cont+1
  830. END
  831. WHEN Keyword='#MESSAGE' THEN;DO
  832. Cont=MM.Messages.Count;MM.Messages.Cont=Linea;MM.Messages.Count=Cont+1
  833. END
  834. WHEN Keyword='#NODE_INFO' THEN;DO
  835. Cont=MM.NodeInfo.Count;MM.NodeInfo.Cont=Linea;MM.NodeInfo.Count=Cont+1
  836. END
  837. OTHERWISE NOP
  838. END
  839. END
  840. END
  841. MM_GetAreas MM.Mails MAIL
  842. IF MM.Mails.Count>1 THEN;DO
  843. Cont=0
  844. DO b=0 FOR MM.Mails.Count
  845. MM_GetAreaInfo MM.Mails.b Info
  846. PARSE UPPER VAR Info.Addr '@' Domain
  847. IF Domain='VIRTUAL' THEN ITERATE
  848. MM.Mails.Cont=MM.Mails.b
  849. Cont=Cont+1
  850. END
  851. MM.Mails.Count=Cont
  852. END
  853. MM_GetSysop 'MM.Sysop'
  854. MM.SysopName=SUBWORD(MM.Sysop,1,1)
  855. DefAreaFix='AREAFIX';DefRaid='RAID'
  856. IF MM.AliasAreaFix.Count=0 THEN MM_AddToStem MM.AliasAreaFix 'DefAreaFix'
  857. IF MM.AliasRaid.Count=0 THEN MM_AddToStem MM.AliasRaid 'DefRaid'
  858. IF ~EXISTS(MM.PathCfg'INACTIVE') THEN CALL MAKEDIR(MM.PathCfg'INACTIVE')
  859. IF ~EXISTS(MM.PathCfg'CHECKPTHRO') THEN CALL MAKEDIR(MM.PathCfg'CHECKPTHRO')
  860. IF ~EXISTS(MM.PolicyPath'AREAFIX') THEN CALL MAKEDIR(MM.PolicyPath'AREAFIX')
  861. IF ~EXISTS(MM.PolicyPath'RAID') THEN CALL MAKEDIR(MM.PolicyPath'RAID')
  862. IF MM.NewArea.Count=0 THEN;DO
  863. CALL WriteLog('Config parse error. You need to specify the NewArea Messages')
  864. CALL Errore('10')
  865. END
  866. IF MM.NodeInfo.Count=0 THEN;DO
  867. CALL WriteLog('Config parse error. You need to specify the NodeInfo #Messages')
  868. CALL Errore('10')
  869. END
  870. IF MM.Message.Count=0 THEN;DO
  871. CALL WriteLog('Config parse error. You need to specify the #Messages')
  872. CALL Errore('10')
  873. END
  874. IF MM.Help.Count=0 THEN;DO
  875. CALL WriteLog('Config parse error. You need to specify the Help Messages')
  876. CALL Errore('10')
  877. END
  878. IF MM.Unknown.Count=0 THEN;DO
  879. CALL WriteLog('Config parse error. You need to specify the Unknown Messages')
  880. CALL Errore('10')
  881. END
  882. IF MM.BadPass.Count=0 THEN;DO
  883. CALL WriteLog('Config parse error. You need to specify the Bad Password Messages')
  884. CALL Errore('10')
  885. END
  886. IF MM.NotPass.Count=0 THEN;DO
  887. CALL WriteLog('Config parse error. You need to specify the No Passivate Messages')
  888. CALL Errore('10')
  889. END
  890. IF MM.NewArea.Count=0 THEN;DO
  891. CALL WriteLog('Config parse error. You need to specify the New Area Messages')
  892. CALL Errore('10')
  893. END
  894. RETURN
  895. Fine:PROCEDURE EXPOSE MM.
  896. IF MM.ProcessPassTHRO=TRUE THEN;DO
  897. IF MM.CheckPThro.Count>0 THEN;DO
  898. MM_GetAreas Maria ECHO
  899. DO i=0 FOR Maria.Count
  900. MM.Body.Count=0
  901. MM_GetAreaInfo Maria.i Info
  902. IF Info.Mbase ~='PTHRO' THEN ITERATE
  903. IF Info.Node.Count=1 THEN;DO
  904. Days=FALSE
  905. DO f=0 FOR MM.CheckPThro.Count
  906. IF INDEX(MM.CheckPThro.f,Info.Node.0) ~=0 THEN;DO
  907. PARSE VAR MM.CheCkPThro.f BossNodo BossPw Days
  908. Days=STRIP(Days)
  909. LEAVE
  910. END
  911. END
  912. IF Days=FALSE THEN;DO
  913. CALL WriteLog('Found the PassThrough Area:' Maria.i 'but not found his Feder - SKIPPING!')
  914. ITERATE
  915. END
  916. IF EXISTS(MM.PathCfg'CHECKPTHRO/'Maria.i) THEN;DO
  917. MM_ReadStem MM.PathCfg'CHECKPTHRO/'Maria.i Linea
  918. PARSE VAR Linea.0 Days Data
  919. IF Data= DATE('C') THEN ITERATE
  920. Days= Days-1
  921. IF Days=0 THEN;DO
  922. CALL WriteLog('Found the PassThrough Area: 'Maria.i 'and sent msg is Feder !')
  923. CALL WriteLog('*** Don`t forget to delete it from the MM Config ***')
  924. CALL AddLine(Body,'-'Maria.i)
  925. CALL AddLine(Body,'---')
  926. PARSE VALUE FindAddr(BossNodo) WITH MM.Address .
  927. MM.Mail=MM.Mails.0
  928. CALL WriteMsg(Body,BossPw,MM.SysOp,MM.Address,'AreaFix',BossNodo,'PVT')
  929. MM_DelAreaNode Maria.i BossNodo
  930. MM.Process=TRUE
  931. ADDRESS COMMAND 'C:Delete >NIL: 'Info.Path' ALL'
  932. MM_DeleteFile MM.PathCfg'CHECKPTHRO/'Maria.i
  933. ITERATE
  934. END
  935. END
  936. OPEN('Out',MM.PathCfg'CHECKPTHRO/'Maria.i,'W')
  937. CALL WRITELN('Out',Days DATE('C'))
  938. CLOSE('Out')
  939. END
  940. END
  941. END
  942. END
  943. CALL Fine2()
  944. RETURN
  945. Fine2:PROCEDURE EXPOSE MM.
  946. IF MM.Process=TRUE THEN;DO
  947. IF MM.Export.Count>0 THEN;DO
  948. DO j=0 FOR MM.BossNode.Count
  949. PARSE VAR MM.BossNode.j Nodo .
  950. MM_SearchInStem MM.Export Resp Nodo'#?' STR
  951. IF Resp.Count>0 THEN;DO
  952. DO n=0 FOR Resp.Count
  953. PARSE VAR Resp.n BossNodo MM.Mail MM.SpecialAddr Addr Area BossPw .
  954. Testo=STRIP(Area)
  955. CALL AddLine(Body,Testo)
  956. END
  957. CALL AddLine(Body,'---')
  958. CALL WriteMsg(Body,BossPw,MM.SysOp,Addr,'AreaFix',BossNodo,'PVT')
  959. DO n=0 FOR Resp.Count
  960. PARSE VAR Resp.n BossNodo MM.Mail MM.SpecialAddr Addr Area BossPw
  961. MM_GetAreaInfo Area MM.Info
  962. DO g=0 FOR MM.NewArea.Count
  963. CALL AddLine(Body,Trasforma(MM.NewArea.g))
  964. END
  965. CALL AddLine(Body,'')
  966. END
  967. CALL AddLine(Body,'---')
  968. CALL WriteMsg(Body,'New Area Linked',MM.PrgName,Addr,MM.SysOp,Addr,'PVT SENT')
  969. END
  970. END
  971. END
  972. MM_SaveCfg
  973. END
  974. IF MM.AutoExport=TRUE THEN;DO
  975. DO i=0 FOR MM.Mails.Count
  976. MM_Export MM.Mails.i
  977. END
  978. END
  979. CALL WriteLog(MM.PrgName '- Ended')
  980. MM_CloseLog
  981. EXIT
  982. RETURN
  983. Errore:PROCEDURE EXPOSE MM.
  984. PARSE ARG Value
  985. CALL WriteLog(MM.PrgName '- *** Error')
  986. EXIT Value
  987. RETURN
  988. AddReplyKludge:
  989. PARSE ARG Stem
  990. Kludge=''
  991. MM_SearchInStem MM.Msg.Head Resp '#?MSGID#?' STR
  992. IF Resp.Count>0 THEN;DO
  993. NewKludge=TRANSLATE(Resp.0,'REPLY','MSGID')
  994. MM_SearchInStem 'MM.'Stem Resp '#?REPLY#?' STR
  995. IF Resp.Count=0 THEN;DO
  996. Kludge=NewKludge
  997. END
  998. END
  999. RETURN Kludge
  1000. WritePolicy:PROCEDURE EXPOSE MM.
  1001. PARSE ARG TagName
  1002. IF EXISTS(MM.PolicyPath||MM.Mode'/'TagName) THEN;DO
  1003. MM_ReadStem MM.PolicyPath||MM.Mode'/'TagName MM.YesPolicy APPEND
  1004. CALL WriteMsg(YesPolicy,'Send Policy of Area: 'TagName,'',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1005. END
  1006. ELSE;DO
  1007. IF MM.NoPolicy.Count=0 THEN;DO
  1008. CALL AddLine(NoPolicy,AddReplyKludge(NoPolicy))
  1009. CALL AddLine(NoPolicy,'')
  1010. CALL AddLine(NoPolicy,'  Area:                                 Status:')
  1011. CALL AddLine(NoPolicy,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  1012. END
  1013. MM_SearchInStem MM.NoPolicy Resp '#?'TagName'#?' STR
  1014. IF Resp.Count=0 THEN;DO
  1015. CALL AddLine(NoPolicy,' 'PadR(2,TagName,35)'  'Message(POLICY_NOT_FOUND))
  1016. END
  1017. END
  1018. RETURN
  1019. WriteMsg:PROCEDURE EXPOSE MM.
  1020. PARSE ARG Stem,Reply_Subj,Reply_From,Reply_FromAddr,Reply_To,Reply_ToAddr,Reply_Flags
  1021. CALL AddLine(Stem,'')
  1022. CALL AddLine(Stem,'-+- 'MM.PrgName' (C) 1994-96 By Paolo Carotenuto')
  1023. CALL AddLine(Stem,'')
  1024. MM_WriteStem 'T:MM.AFP.Tmp' 'MM.'Stem
  1025. IF Reply_From='' THEN;DO
  1026. Reply_From='AreaFix'
  1027. IF MM.Mode='RAID' THEN Reply_From='Raid'
  1028. END
  1029. CALL WriteLog('Replying to' Reply_To '- Subj:' Reply_Subj)
  1030. Reply.Subj=Reply_Subj;Reply.From=Reply_From
  1031. Reply.FromAddr=Reply_FromAddr;Reply.To=Reply_To
  1032. Reply.ToAddr=Reply_ToAddr;Reply.Flags=Reply_Flags
  1033. Reply.File='T:MM.AFP.Tmp'
  1034. MM_WriteMsg MM.Mail Reply
  1035. MM_DeleteFile 'T:MM.AFP.Tmp'
  1036. INTERPRET "MM."Stem".Count = 0"
  1037. RETURN
  1038. WriteLog:PROCEDURE EXPOSE MM.
  1039. PARSE ARG Testo
  1040. MM_WriteLog 'Testo' MM.LogLevel
  1041. RETURN
  1042. Init:PROCEDURE EXPOSE MM.
  1043. MM.Extended.Count=0;MM.ExteResc.Count=0
  1044. MM.NoPolicy.Count=0;MM.Body.Count=0;MM.Days=0
  1045. MM.ListStatus=FALSE;MM.Status=FALSE;MM.PAStatus=FALSE
  1046. MM.ForceRescan=FALSE;MM.Rescan=FALSE;MM.Query=FALSE
  1047. MM.List=FALSE;MM.Unlinked=FALSE;MM.Help=FALSE;MM.Force=FALSE
  1048. RETURN
  1049. ListaNodi:PROCEDURE EXPOSE MM.
  1050. MM_GetNodes MM.Nodes
  1051. MM_SortAddresses MM.Nodes
  1052. MM_MultiSelReq MM.Nodes MM.NodiResp '"Change Linked Areas For Node"' STR
  1053. RETURN MM.NodiResp.Count
  1054. ListaAree:PROCEDURE EXPOSE MM.
  1055. IF MM.Mode='AREAFIX' THEN;DO
  1056. MM.AreeNodo.Count=0
  1057. DO n=0 FOR MM.Aree.Count
  1058. Tab='  '
  1059. IF IsConnected(MM.Aree.n,MM.NodoResp.0)=TRUE THEN Tab='* '
  1060. Cont=MM.AreeNodo.Count
  1061. MM.AreeNodo.Cont=Tab||MM.Aree.n
  1062. MM.AreeNodo.Count=Cont+1
  1063. END
  1064. MM_MultiSelReq MM.AreeNodo MM.AreeResp '"Change Linked Nodes For Area"' STR
  1065. END
  1066. ELSE MM_MultiSelReq MM.Aree MM.AreeResp '"Change Linked Nodes For Area"' STR
  1067. RETURN MM.AreeResp.Count
  1068. ListaAreeNodo:PROCEDURE EXPOSE MM.
  1069. MM_GetNodeInfo MM.NodoResp.0 Info
  1070. MM.AreeNodo.Count=0
  1071. DO i=0 FOR Info.GroupCount
  1072. IF MM.Force=TRUE THEN Info.GroupLevel.i='255'
  1073. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  1074. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  1075. DO n=0 FOR Aree.Count
  1076. Tab='  '
  1077. IF IsConnected(Aree.n.Area,MM.NodoResp.0)=TRUE THEN Tab='* '
  1078. Tipo=GetAreaType(Aree.n.Area);IF Tipo='MAIL'|Tipo='BAD' THEN ITERATE
  1079. CALL AddLine(AreeNodo,Tab||Aree.n.Area)
  1080. END
  1081. END
  1082. MM_SortStem MM.AreeNodo
  1083. MM_MultiSelReq MM.AreeNodo MM.AreeResp '"Change Linked Nodes For Area"' STR
  1084. RETURN MM.AreeResp.Count
  1085. ListaNodo:PROCEDURE EXPOSE MM.
  1086. MM_GetNodes MM.Nodes
  1087. MM_SortAddresses MM.Nodes
  1088. MM_SingleSelReq MM.Nodes MM.NodoResp '"Change Linked Areas For Node"' STR
  1089. RETURN MM.NodoResp.Count
  1090. ListaAreeLink:PROCEDURE EXPOSE MM.
  1091. MM_GetNodeInfo MM.NodoResp.0 MM.NodoInfo
  1092. IF MM.Mode='AREAFIX' THEN;DO
  1093. MM_SortStem MM.NodoInfo.Area
  1094. MM_MultiSelReq MM.NodoInfo.Area MM.AreeResp '"Change Linked Nodes For Area"' STR
  1095. END
  1096. ELSE;DO
  1097. MM_SortStem MM.NodoInfo.TickArea
  1098. MM_MultiSelReq MM.NodoInfo.TickArea MM.AreeResp '"Change Linked Nodes For Area"' STR
  1099. END
  1100. RETURN MM.AreeResp.Count
  1101. ListaSwitch:PROCEDURE EXPOSE MM.
  1102. MM.Switches.0='List of all Available areas [-L]';MM.Switches.1='List of all Linked areas    [-Q]'
  1103. MM.Switches.2='List of all Unlinked areas  [-U]';MM.Switches.3='List of areas of my UPLINK  [-A]'
  1104. MM.Switches.4='Infos About Node            [-I]';MM.Switches.5='Help Files                  [-H]'
  1105. MM.Switches.Count=6
  1106. MM_MultiSelReq MM.Switches MM.SwitchResp '"Select a Switchs"' STR
  1107. RETURN rc
  1108. ViewDomain:PROCEDURE EXPOSE MM.
  1109. MM_GetAddrs Address
  1110. DO i=0 FOR Address.Count
  1111. PARSE UPPER VAR Address.i '@' Network
  1112. IF UPPER(Network)='VIRTUAL' THEN ITERATE
  1113. MM_SearchInStem MM.Domain Resp Network STR
  1114. IF Resp.Count=0 THEN MM_AddToStem MM.Domain 'Network'
  1115. END
  1116. MM_SortStem MM.Domain
  1117. MM_SingleSelReq MM.Domain MM.DomainResp '"Select Domain"' STR
  1118. IF MM.DomainResp.Count=0 THEN RETURN 0
  1119. MM_GetNodes MM.AllNode
  1120. MM.Nodes.Count=0
  1121. DO i=0 FOR MM.AllNode.Count
  1122. PARSE VAR MM.AllNode.i . '@' Domain
  1123. IF UPPER(STRIP(Domain))=UPPER(STRIP(MM.DomainResp.0)) THEN;DO
  1124. Nodo=MM.AllNode.i
  1125. MM_AddToStem MM.Nodes 'Nodo'
  1126. END
  1127. END
  1128. MM_SortAddresses MM.Nodes
  1129. MM_MultiSelReq MM.Nodes MM.NodiResp '"Change Linked Areas For Node"' STR
  1130. IF MM.NodiResp.Count=0 THEN RETURN 0
  1131. IF MM.Mode='AREAFIX' THEN MM_GetAreas MM.Aree ECHO
  1132. ELSE MM_GetTickAreas MM.Aree
  1133. xAree.Count=0
  1134. DO i=0 FOR MM.Aree.Count
  1135. IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo MM.Aree.i Info
  1136. ELSE MM_GetTickAreaInfo MM.Aree.i Info
  1137. PARSE VAR Info.Addr . '@' xDomain
  1138. Area=MM.Aree.i
  1139. IF UPPER(MM.DomainResp.0)=UPPER(xDomain) THEN MM_AddToStem xAree 'Area'
  1140. END
  1141. MM.SortStem xAree
  1142. MM_MultiSelReq xAree MM.AreeResp '"Change Linked Nodes For Area"' STR
  1143. RETURN MM.AreeResp.Count
  1144. Usage:PROCEDURE EXPOSE MM.
  1145. SAY ''
  1146. SAY 'MM_AreaFixPlus (C) 1994-96 By Paolo Carotenuto'
  1147. SAY ''
  1148. SAY 'Usage:'
  1149. SAY '> Rx MM_AreaFixPlus <MUI>'
  1150. SAY '> Rx MM_AreaFixPlus <MSG MailArea Message_Number>'
  1151. SAY '> Rx MM_AreaFixPlus <WRITEPOLICY MailArea Message_Number>'
  1152. SAY '> Rx MM_AreaFixPlus <Node@Domain> <Mode> <-/+Tagname|Cmd> <MailArea> [<-Switch>]'
  1153. SAY ''
  1154. SAY ' MUI         - Use Only if MM is Running'
  1155. SAY ' MSG         - Process Message #number in Mail Area'
  1156. SAY ' WRITEPOLICY - Write Policy Automagically'
  1157. SAY ''
  1158. SAY ' Mode        - Select Areafix (For Echomail) or Raid (for Files)'
  1159. SAY ''
  1160. SAY 'Cmd:'
  1161. SAY ''
  1162. SAY ' INACTIVE  - Turn Off Areas for Node'
  1163. SAY ' ACTIVE    - Activate all Areas for Node'
  1164. SAY '             [When using Inactive|Active you must not use any -Switch]'
  1165. SAY ''
  1166. SAY ' -ALL      - Unlink all Areas for Node'
  1167. SAY ' +ALL      - Link all Areas for Node'
  1168. SAY ''
  1169. SAY ' INFO      - Infos About the Node'
  1170. SAY ' AVAIL     - To Send the List of areas oft my UPLINK'
  1171. SAY ' HELP      - To Send the Help Files'
  1172. SAY ' NONE      - Use this if you want to use Switches'
  1173. SAY ''
  1174. SAY 'Summary of Switches:'
  1175. SAY ' -L        - List of all Available areas'
  1176. SAY ' -Q        - List of all Linked areas'
  1177. SAY ' -U        - List of all Unlinked areas'
  1178. SAY ' -H        - Help File'
  1179. SAY ' -I        - Infos About the Node'
  1180. SAY ' -A        - To Send the List of areas of my UPLINK'
  1181. SAY ' -P        - To Send Policy of Areas'
  1182. SAY ' -R        - Rescan of <Tagname> (Only for EchoMail)'
  1183. SAY ' -FR       - ForceRescan of <Tagname> (Only for EchoMail)'
  1184. SAY ''
  1185. EXIT
  1186. RETURN
  1187. SysopName:PROCEDURE EXPOSE MM.
  1188. PARSE ARG Node
  1189. MM_GetNodelistNode Node NodeInfo
  1190. IF Rc=0 THEN;DO
  1191. RETURN NodeInfo.Sysop
  1192. END
  1193. RETURN 'Sysop On' Node
  1194. MuiCli:PROCEDURE EXPOSE MM.
  1195. IF UPPER(MM.Node)='WRITEPOLICY' THEN;DO
  1196. MM.Mail=MM.Mode;MM_ReadMsg MM.Mail MM.Command Msg
  1197. MM.Alias.0='Areafix';MM.Alias.1='Raid';MM.Alias.Count=2
  1198. MM_SingleSelReq MM.Alias Resp '"Select One Mode"' STR
  1199. IF Resp.Count=0 THEN CALL Fine2()
  1200. MM.Mode=Resp.0
  1201. MM_WriteStem MM.PolicyPath||MM.Mode'/'MM.Mail Msg.Text
  1202. CALL Fine2()
  1203. END
  1204. IF UPPER(MM.Node)='MSG' THEN;DO
  1205. MM.Mail=MM.Mode;MM_ReadMsg MM.Mail MM.Command Msg
  1206. Type=STRIP(Msg.To);MM_SearchInStem MM.AliasAreaFix Resp Type STR
  1207. IF Resp.Count>0 THEN MM.Mode='AREAFIX'
  1208. ELSE;DO;MM_SearchInStem MM.AliasRaid Resp Type STR;IF Resp.Count>0 THEN;DO;MM.Mode='RAID';END;ELSE RETURN;END
  1209. CALL ProcessaMsg(MM.Command);CALL Fine2()
  1210. END
  1211. IF UPPER(MM.Node)='MUI' THEN;DO
  1212. MM.Type.0='Work On EchoMail Areas';MM.Type.1='Work On Files (.TIC) Areas'
  1213. MM.Type.Count=2
  1214. MM_SingleSelReq MM.Type MM.ModeResp '"'MM.PrgName'"' STR
  1215. IF MM.ModeResp.Count=0 THEN CALL Fine2()
  1216. IF MM.Mails.Count>1 THEN;DO
  1217. MM_SingleSelReq MM.Mails MM.MailResp '"Select one MailArea"' STR
  1218. IF MM.MailResp.Count=0 THEN EXIT
  1219. MM.Mail=MM.MailResp.0
  1220. END
  1221. ELSE MM.Mail=MM.Mails.0
  1222. SELECT
  1223. WHEN MM.ModeResp.0=MM.Type.0 THEN;DO
  1224. MM_GetAreas MM.Aree ECHO
  1225. MM.Mode='AREAFIX'
  1226. MM.Commands.count=12
  1227. MM.ModeRescan.0='Normal Rescan';MM.ModeRescan.1='Force Rescan'
  1228. MM.ModeRescan.Count=2
  1229. END
  1230. WHEN MM.ModeResp.0=MM.Type.1 THEN;DO
  1231. MM_GetTickAreas MM.Aree
  1232. MM.Mode='RAID'
  1233. MM.Commands.count=10
  1234. END
  1235. OTHERWISE NOP
  1236. END
  1237. MM_SortStem MM.Aree
  1238. MM.Commands.0='Edit Links';MM.Commands.1='Force Edit Links'
  1239. MM.Commands.2='Edit Single UnLinks';MM.Commands.3='Edit Multiple UnLinks'
  1240. MM.Commands.4='Inactive Node';MM.Commands.5='Active Node'
  1241. MM.Commands.6='-ALL Node';MM.Commands.7='+ALL Node'
  1242. MM.Commands.8='Send Policy to Node';MM.Commands.9='NO Command (use only Switchs)'
  1243. MM.Commands.10='Rescan All Linked Area';MM.Commands.11='Rescan Multiple Node'
  1244. DO FOREVER
  1245. CALL Init()
  1246. MM_SingleSelReq MM.Commands MM.CommResp '"Select One Command"' STR
  1247. IF MM.CommResp.Count=0 THEN LEAVE
  1248. SELECT
  1249. WHEN MM.CommResp.0=MM.Commands.0 THEN;DO
  1250. IF ListaNodo()=0 THEN ITERATE
  1251. IF ListaAreeNodo()=0 THEN ITERATE
  1252. CALL ListaSwitch()
  1253. MM.FromName=SysopName(MM.NodoResp.0)
  1254. MM.FromNode=MM.NodoResp.0
  1255. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1256. DO h=0 FOR MM.AreeResp.Count
  1257. CALL PrintAree(Body,MM.AreeResp.h,Message(ConnectArea(STRIP(TRANSLATE(MM.AreeResp.h,' ','*')),MM.NodoResp.0)))
  1258. END
  1259. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1260. DO w=0 FOR MM.SwitchResp.Count
  1261. CALL GoSwitch(MM.NodoResp.0,MM.SwitchResp.w)
  1262. END
  1263. END
  1264. WHEN MM.CommResp.0=MM.Commands.1 THEN;DO
  1265. MM.Force=TRUE
  1266. IF ListaNodo()=0 THEN ITERATE
  1267. IF ListaAreeNodo()=0 THEN ITERATE
  1268. CALL ListaSwitch()
  1269. MM.FromName=SysopName(MM.NodoResp.0)
  1270. MM.FromNode=MM.NodoResp.0
  1271. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1272. DO h=0 FOR MM.AreeResp.Count
  1273. CALL PrintAree(Body,MM.AreeResp.h,Message(ConnectArea(STRIP(TRANSLATE(MM.AreeResp.h,' ','*')),MM.NodoResp.0)))
  1274. END
  1275. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1276. DO w=0 FOR MM.SwitchResp.Count
  1277. CALL GoSwitch(MM.NodoResp.0,MM.SwitchResp.w)
  1278. END
  1279. END
  1280. WHEN MM.CommResp.0=MM.Commands.2 THEN;DO
  1281. IF ListaNodo()=0 THEN ITERATE
  1282. IF ListaAreeLink()=0 THEN ITERATE
  1283. CALL ListaSwitch()
  1284. MM.FromName=SysopName(MM.NodoResp.0)
  1285. MM.FromNode=MM.NodoResp.0
  1286. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1287. DO h=0 FOR MM.AreeResp.Count
  1288. CALL PrintAree(Body,MM.AreeResp.h,Message(DisConnectArea(MM.AreeResp.h,MM.NodoResp.0)))
  1289. END
  1290. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1291. DO w=0 FOR MM.SwitchResp.Count
  1292. CALL GoSwitch(MM.NodoResp.0,MM.SwitchResp.w)
  1293. END
  1294. END
  1295. WHEN MM.CommResp.0=MM.Commands.3 THEN;DO
  1296. IF ViewDomain()=0 THEN ITERATE
  1297. CALL ListaSwitch()
  1298. DO f=0 FOR MM.NodiResp.Count
  1299. MM.FromName=SysopName(MM.NodiResp.f)
  1300. MM.FromNode=MM.NodiResp.f
  1301. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1302. DO h=0 FOR MM.AreeResp.Count
  1303. CALL PrintAree(Body,MM.AreeResp.h,Message(DisConnectArea(MM.AreeResp.h,MM.NodiResp.f)))
  1304. END
  1305. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1306. DO w=0 FOR MM.SwitchResp.Count
  1307. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1308. END
  1309. MM.Status=FALSE
  1310. END
  1311. END
  1312. WHEN MM.CommResp.0=MM.Commands.4 THEN;DO
  1313. IF ListaNodi()=0 THEN ITERATE
  1314. DO h=0 FOR MM.NodiResp.Count
  1315. MM.FromName=SysopName(MM.NodiResp.h)
  1316. MM.FromNode=MM.NodiResp.h
  1317. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1318. CALL Extended(MM.NodiResp.h,'%INACTIVE')
  1319. MM.Status=FALSE
  1320. END
  1321. END
  1322. WHEN MM.CommResp.0=MM.Commands.5 THEN;DO
  1323. IF ListaNodi()=0 THEN ITERATE
  1324. DO h=0 FOR MM.NodiResp.Count
  1325. MM.FromName=SysopName(MM.NodiResp.h)
  1326. MM.FromNode=MM.NodiResp.h
  1327. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1328. CALL Extended(MM.NodiResp.h,'%ACTIVE')
  1329. MM.Status=FALSE
  1330. END
  1331. END
  1332. WHEN MM.CommResp.0=MM.Commands.6 THEN;DO
  1333. IF ListaNodi()=0 THEN ITERATE
  1334. CALL ListaSwitch()
  1335. DO h=0 FOR MM.NodiResp.Count
  1336. MM.FromName=SysopName(MM.NodiResp.h)
  1337. MM.FromNode=MM.NodiResp.h
  1338. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1339. CALL Extended(MM.NodiResp.h,'%-ALL')
  1340. DO w=0 FOR MM.SwitchResp.Count
  1341. CALL GoSwitch(MM.NodiResp.h,MM.SwitchResp.w)
  1342. END
  1343. MM.Status=FALSE
  1344. END
  1345. END
  1346. WHEN MM.CommResp.0=MM.Commands.7 THEN;DO
  1347. IF ListaNodi()=0 THEN ITERATE
  1348. CALL ListaSwitch()
  1349. DO h=0 FOR MM.NodiResp.Count
  1350. MM.FromName=SysopName(MM.NodiResp.h)
  1351. MM.FromNode=MM.NodiResp.h
  1352. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1353. CALL Extended(MM.Node,'%+ALL')
  1354. DO w=0 FOR MM.SwitchResp.Count
  1355. CALL GoSwitch(MM.NodiResp.h,MM.SwitchResp.w)
  1356. END
  1357. MM.Status=FALSE
  1358. END
  1359. END
  1360. WHEN MM.CommResp.0=MM.Commands.8 THEN;DO
  1361. IF ViewDomain()=0 THEN ITERATE
  1362. DO f=0 FOR MM.NodiResp.Count
  1363. MM.FromName=SysopName(MM.NodiResp.f)
  1364. MM.FromNode=MM.NodiResp.f
  1365. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1366. DO h=0 FOR MM.AreeResp.Count
  1367. CALL WritePolicy(MM.AreeResp.h)
  1368. END
  1369. MM.Status=FALSE
  1370. IF MM.NoPolicy.Count>0 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1371. END
  1372. END
  1373. WHEN MM.CommResp.0=MM.Commands.9 THEN;DO
  1374. IF ListaNodi()=0 THEN ITERATE
  1375. CALL ListaSwitch()
  1376. DO f=0 FOR MM.NodiResp.Count
  1377. MM.FromName=SysopName(MM.NodiResp.f)
  1378. MM.FromNode=MM.NodiResp.f
  1379. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1380. DO w=0 FOR MM.SwitchResp.Count
  1381. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1382. END
  1383. MM.Status=FALSE
  1384. END
  1385. END
  1386. WHEN MM.CommResp.0=MM.Commands.10 THEN;DO
  1387. MM_SingleSelReq MM.ModeRescan MM.CommResp '"Select One Mode"' STR
  1388. IF MM.CommResp.Count=0 THEN ITERATE
  1389. IF MM.CommResp.0=MM.ModeRescan.1 THEN MM.ActionForce=TRUE
  1390. IF ListaNodi()=0 THEN ITERATE
  1391. CALL ListaSwitch()
  1392. DO f=0 FOR MM.NodiResp.Count
  1393. MM.FromName=SysopName(MM.NodiResp.f)
  1394. MM.FromNode=MM.NodiResp.f
  1395. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1396. MM_GetNodeInfo MM.NodiResp.f Info
  1397. DO i=0 FOR Info.GroupCount
  1398. MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  1399. DO n=0 FOR Aree.Count
  1400. IF GetAreaType(Aree.n.Area)='MAIL' THEN ITERATE
  1401. IF IsConnected(Aree.n.Area,MM.NodiResp.f)=TRUE THEN CALL PrintAree(Body,Aree.n.Area,Message(Rescan(MM.NodiResp.f,Aree.n.Area)))
  1402. END
  1403. END
  1404. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1405. DO w=0 FOR MM.SwitchResp.Count
  1406. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1407. END
  1408. MM.Status=FALSE
  1409. END
  1410. END
  1411. WHEN MM.CommResp.0=MM.Commands.11 THEN;DO
  1412. MM_SingleSelReq MM.ModeRescan MM.CommResp '"Select One Mode"' STR
  1413. IF MM.CommResp.Count=0 THEN ITERATE
  1414. IF MM.CommResp.0=MM.ModeRescan.1 THEN MM.ActionForce=TRUE
  1415. IF ViewDomain()=0 THEN ITERATE
  1416. CALL ListaSwitch()
  1417. DO f=0 FOR MM.NodiResp.Count
  1418. MM.FromName=SysopName(MM.NodiResp.f)
  1419. MM.FromNode=MM.NodiResp.f
  1420. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1421. DO h=0 FOR MM.AreeResp.Count
  1422. LinkArea=STRIP(TRANSLATE(MM.AreeResp.h,' ','*'))
  1423. CALL PrintAree(Body,MM.AreeResp.h,Message(Rescan(MM.NodiResp.f,LinkArea)))
  1424. END
  1425. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1426. DO w=0 FOR MM.SwitchResp.Count
  1427. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1428. END
  1429. MM.Status=FALSE
  1430. END
  1431. END
  1432. OTHERWISE NOP
  1433. END
  1434. END
  1435. CALL Fine()
  1436. END
  1437. PARSE VALUE FindAddr(MM.Node) WITH MM.Address .
  1438. MM.FromName=SysopName(MM.Node)
  1439. IF INDEX(UPPER(MM.FromName),'SYSOP ON')=0 THEN MM.FromFirst=SUBWORD(MM.FromName,1)
  1440. ELSE MM.FromFirst=MM.FromName
  1441. MM.FromNode=MM.Node;MM.Switch=UPPER(MM.Switch)
  1442. MM.Mode=UPPER(MM.Mode);MM.ToNode=MM.Address;MM.Command=UPPER(MM.Command)
  1443. CALL Init()
  1444. SELECT
  1445. WHEN MM.Command='INACTIVE' THEN CALL Extended(MM.Node,'%INACTIVE')
  1446. WHEN MM.Command='ACTIVE' THEN CALL Extended(MM.Node,'%ACTIVE')
  1447. WHEN MM.Command='+ALL' THEN CALL Extended(MM.Node,'%+ALL')
  1448. WHEN MM.Command='-ALL' THEN CALL Extended(MM.Node,'%-ALL')
  1449. WHEN MM.Command='INFO' THEN CALL Extended(MM.Node,'%INFO')
  1450. WHEN MM.Command='AVAIL' THEN CALL Extended(MM.Node,'%AVAIL')
  1451. WHEN MM.Command='HELP' THEN CALL Extended(MM.Node,'%HELP')
  1452. WHEN LEFT(MM.Command,1)='+' THEN;DO
  1453. IF MM.Mode='AREAFIX' THEN;DO
  1454. IF INDEX(MM.Switch,'-R') ~=0 THEN MM.Rescan=TRUE
  1455. IF INDEX(MM.Switch,'-FR') ~=0 THEN MM.ForceRescan=TRUE
  1456. END
  1457. SAY MM.PrgName '-' MM.Node MM.Command ConnectArea(STRIP(TRANSLATE(MM.Command,' ','+')),MM.Node)
  1458. END
  1459. WHEN LEFT(MM.Command,1)='-' THEN SAY MM.PrgName '-' MM.Node MM.Command DisconnectArea(STRIP(TRANSLATE(MM.Command,' ','-')),MM.Node)
  1460. OTHERWISE NOP
  1461. END
  1462. IF MM.Body.Count>=1 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1463. IF MM.Command='INACTIVE'|MM.Command='ACTIVE' THEN;DO
  1464. IF MM.NoPolicy.Count>0 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1465. Fine2()
  1466. END
  1467. CALL GoSwitch(MM.Node,MM.Switch)
  1468. IF MM.NoPolicy.Count>0 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1469. CALL Fine2()
  1470. RETURN
  1471. GoSwitch:PROCEDURE EXPOSE MM.
  1472. PARSE ARG Nodo,Line
  1473. IF INDEX(Line,'-Q') ~=0 THEN CALL Extended(Nodo,'%Q');IF INDEX(Line,'-L') ~=0 THEN CALL Extended(Nodo,'%L')
  1474. IF INDEX(Line,'-U') ~=0 THEN CALL Extended(Nodo,'%U');IF INDEX(Line,'-I') ~=0 THEN CALL Extended(Nodo,'%I')
  1475. IF INDEX(Line,'-H') ~=0 THEN CALL Extended(Nodo,'%H');IF INDEX(Line,'-P') ~=0 THEN CALL Extended(Nodo,'%P')
  1476. IF INDEX(Line,'-A') ~=0 THEN CALL Extended(Nodo,'%A')
  1477. RETURN